package com.coffee.ws.metadata;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.nio.ByteBuffer;

/**
 * 接收 和 发送都是改 结构；  服务器只做转发；
 * 聊天 消息  结构
 *   前端必须遵从 该规则
 * @author: songkui
 * @since: 2023/2/21 18:05
 */
@Setter
@Getter
@ToString
public class CoffeeChatMessage extends BasicBinaryMessage {
    private byte fromType; //聊天来自 类型； 1，群聊  2， 私聊
    private long fromId;  // 聊天来自 位置
    private byte extension;  // 富文本 扩展类型: 1: 语音mp3， 2:图片 jpg， -1: 字符串 等
    private int dataLength;  // 聊天内容 长度
    private byte[] data;

    @Override
    public CoffeeChatMessage decode(ByteBuffer byteBuffer) {
        CoffeeChatMessage message = new CoffeeChatMessage();
        message.setFromType(byteBuffer.get());
        message.setFromId(byteBuffer.getLong());
        message.setExtension(byteBuffer.get());
        message.setDataLength(byteBuffer.getInt());
        byte[] data = new byte[message.getDataLength()];
        byteBuffer.get(data);
        message.setData(data);
        return message;
    }


    @Override
    public void encode(ByteBuffer byteBuffer) {
        byteBuffer.put(this.getFromType());
        byteBuffer.putLong(this.getFromId());
        byteBuffer.put(this.extension);
        byteBuffer.putInt(this.data.length);
        byteBuffer.put(this.data);
    }

    @Override
    public int length() {
        return 14 + (this.data == null ? 0 : this.data.length);
    }

    //
    //public static void main(String[] args) {
    //    CoffeeChatMessage bufferMessage = new CoffeeChatMessage();
    //    bufferMessage.setType((byte) 1);
    //    bufferMessage.setCmd(1000);
    //    bufferMessage.setFromType((byte) 1);
    //    bufferMessage.setFromId(100000L);
    //    bufferMessage.setExtension((byte) 1);
    //    byte[] data = StrUtil.bytes("Hello world!", StandardCharsets.UTF_8);
    //    bufferMessage.setLength(data.length);
    //    bufferMessage.setData(data);
    //
    //    ByteBuffer byteBuffer = bufferMessage.encode();
    //    System.out.println(" ------------------{}--- " + byteBuffer.limit());
    //
    //    CoffeeChatMessage eM = bufferMessage.decode(byteBuffer);
    //
    //    System.out.println(eM.getCmd());
    //    System.out.println(eM.getExtension());
    //    System.out.println(eM.getLength());
    //    System.out.println(StrUtil.str(eM.getData(), StandardCharsets.UTF_8));
    //
    //    CoffeeChatMessage eM2 = bufferMessage.decode(byteBuffer);
    //    System.out.println(eM2.toString());
    //
    //    //try {
    //    //    test();
    //    //} catch (UnsupportedEncodingException e) {
    //    //    e.printStackTrace();
    //    //}
    //
    //}
    //
    //private static void test() throws UnsupportedEncodingException {
    //    // ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024 * 4);
    //    ByteBuffer byteBuffer = ByteBuffer.allocate(1024 * 4);
    //
    //    // Q: 初始化之后，这三个值分别是多少呢？
    //    System.out.println("position: " + byteBuffer.position());
    //    System.out.println("capacity: " + byteBuffer.capacity());
    //    System.out.println("limit: " + byteBuffer.limit());
    //
    //    //向ByteBuffer写入数据
    //    byteBuffer.put("hello, 喜欢天文的pony站长~".getBytes(Constants.CHARSET));
    //
    //    // Q: 向ByteBuffer中写入数据之后，哪些值会发生变化呢？
    //    System.out.println(StrUtil.repeat("=", 10) + "写入数据之后" + StrUtil.repeat("=", 10));
    //    System.out.println("position: " + byteBuffer.position());
    //    System.out.println("capacity: " + byteBuffer.capacity());
    //    System.out.println("limit: " + byteBuffer.limit());
    //
    //    //将ByteBuffer从写模式调整为读模式
    //    byteBuffer.flip();
    //
    //    //将ByteBuffer从写模式调整为读模式之后，ByteBuffer的哪些值会发生变化？
    //    System.out.println(StrUtil.repeat("=", 10) + "调整ByteBuffer为读模式之后" + StrUtil.repeat("=", 10));
    //    System.out.println("position: " + byteBuffer.position());
    //    System.out.println("capacity: " + byteBuffer.capacity());
    //    System.out.println("limit: " + byteBuffer.limit());
    //
    //    //从ByteBuffer中读取一个字节
    //    byteBuffer.get();
    //    // Q: 从ByteBuffer中读取一个字节之后，哪些值会发生变化?
    //    System.out.println(StrUtil.repeat("=", 10) + "从ByteBuffer中读取一个字节之后" + StrUtil.repeat("=", 10));
    //    System.out.println("position: " + byteBuffer.position());
    //    System.out.println("capacity: " + byteBuffer.capacity());
    //    System.out.println("limit: " + byteBuffer.limit());
    //
    //    // 记录一个标记
    //    byteBuffer.mark();
    //    // 继续往下读取
    //    byteBuffer.get();
    //    System.out.println(StrUtil.repeat("=", 10) + "记录一个标记之后继续往下读取" + StrUtil.repeat("=", 10));
    //    System.out.println("position: " + byteBuffer.position());
    //    System.out.println("capacity: " + byteBuffer.capacity());
    //    System.out.println("limit: " + byteBuffer.limit());
    //
    //    //重置position到上一次mark()的标记位置
    //    byteBuffer.reset();
    //    System.out.println(StrUtil.repeat("=", 10) + "reset之后" + StrUtil.repeat("=", 10));
    //    System.out.println("position: " + byteBuffer.position());
    //    System.out.println("capacity: " + byteBuffer.capacity());
    //    System.out.println("limit: " + byteBuffer.limit());
    //
    //    System.out.println("byteBuffer中是否还有数据:" + byteBuffer.hasRemaining());
    //    //拷贝未读取的数据到缓冲区最前面
    //    byteBuffer.compact();
    //    System.out.println(StrUtil.repeat("=", 10) + "compact之后" + StrUtil.repeat("=", 10));
    //    System.out.println("position: " + byteBuffer.position());
    //    System.out.println("capacity: " + byteBuffer.capacity());
    //    System.out.println("limit: " + byteBuffer.limit());
    //
    //    //逻辑上清空数据=>实际上只是指针的变化
    //    byteBuffer.clear();
    //    System.out.println(StrUtil.repeat("=", 10) + "clear之后" + StrUtil.repeat("=", 10));
    //    System.out.println("position: " + byteBuffer.position());
    //    System.out.println("capacity: " + byteBuffer.capacity());
    //    System.out.println("limit: " + byteBuffer.limit());
    //}


}
